package fun.coding.leetcode;

import java.util.LinkedList;
import java.util.List;

public class LetterCombinationsOfPhoneNumber {

	public static void main(String[] args) {
		LetterCombinationsOfPhoneNumber ins = new LetterCombinationsOfPhoneNumber();
		String test1 = "23";
		List<String> res1 = ins.letterCombinations(test1);
		LeetCodeHelpers.printGenericList(res1);
	}
	
	public List<String> letterCombinations(String digits) {
		List<String> res = new LinkedList<String>();
		
		if (digits == null) return res;
		
		if (digits.length() == 0) {
			res.add("");
			return res;
		}
		
		StringBuilder sb = new StringBuilder();
		helper(digits, 0, res, sb);
		return res;
	}
	
	private void helper(String digits, int index, List<String> res, StringBuilder sb) {
		if (index == digits.length()) {
			res.add(sb.toString());
			return;
		}
		
		List<String> mappedStrings = this.digitToString(digits.charAt(index));
		for (String s : mappedStrings) {
			sb.append(s);
			helper(digits, index + 1, res, sb);
			sb.deleteCharAt(sb.length() - 1);
		}
	}
	
	private List<String> digitToString(char c) {
		List<String> r = new LinkedList<String>();
		
		// This could be optimzied using a map or something
		switch (c) {
		case '1':
		case '0':
			break;
		case '2':
			r.add("a");
			r.add("b");
			r.add("c");
			break;
		case '3':
			r.add("d");
			r.add("e");
			r.add("f");
			break;
		case '4':
			r.add("g");
			r.add("h");
			r.add("i");
			break;
		case '5':
			r.add("j");
			r.add("k");
			r.add("l");
			break;
		case '6':
			r.add("m");
			r.add("n");
			r.add("o");
			break;
		case '7':
			r.add("p");
			r.add("q");
			r.add("r");
			r.add("s");
			break;
		case '8':
			r.add("t");
			r.add("u");
			r.add("v");
			break;
		case '9':
			r.add("w");
			r.add("x");
			r.add("y");
			r.add("z");
			break;
		}
		
		return r;
	}
}
